package proyecto.ort.edu.uy.dominio;

import java.io.Serializable;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;

import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name = "USUARIOS")
@SequenceGenerator(name = "USUARIO_SEQ", sequenceName = "USUARIO_SEQ")
public class Usuario implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1874842398096705263L;

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "USUARIO_SEQ")
	private Long idUsuario;

	@Column(length = 20)
	private String nombres;

	@Column(length = 20)
	private String apellidos;

	@Column(name = "USERNAME", unique = true, length = 50)
	private String username;

	@Column(length = 20)
	private String password;

	@Column(length = 50)
	private String mail;

	@OneToOne(cascade = CascadeType.ALL)
	private Empresa empresa;

	@OneToOne()
	private Nivel nivelUsuario;

	@ManyToMany()
	@JoinTable(name = "GRUPO_USUARIOS", joinColumns = { @JoinColumn(name = "id_Usuario") }, inverseJoinColumns = { @JoinColumn(name = "id_Grupo") })
	private List<GrupoUsuario> lstGrupoUsuarios;

	private String imagen;

	public String getImagen() {

		if (imagen == null) {
			imagen = getImage();
		}
		return imagen;
	}

	public void setImagen(String imagen) {
		this.imagen = imagen;
	}

	public List<GrupoUsuario> getLstGrupoUsuarios() {
		return lstGrupoUsuarios;
	}

	public void setLstGrupoUsuarios(List<GrupoUsuario> lstGrupoUsuarios) {
		this.lstGrupoUsuarios = lstGrupoUsuarios;
	}

	public String getApellidos() {
		return apellidos;
	}

	public Empresa getEmpresa() {
		return empresa;
	}

	public Long getIdUsuario() {
		return idUsuario;
	}

	public String getMail() {
		return mail;
	}

	public Nivel getNivelUsuario() {
		return nivelUsuario;
	}

	public String getNombres() {
		return nombres;
	}

	public String getPassword() {
		return password;
	}

	public String getUsername() {
		return username;
	}

	public void setApellidos(String apellidos) {
		this.apellidos = apellidos;
	}

	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}

	public void setIdUsuario(Long idUsuario) {
		this.idUsuario = idUsuario;
	}

	public void setMail(String mail) {
		this.mail = mail;
	}

	public void setNivelUsuario(Nivel nivelUsuario) {
		this.nivelUsuario = nivelUsuario;
	}

	public void setNombres(String nombres) {
		this.nombres = nombres;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;

		if (!(obj instanceof Usuario))
			return false;

		final Usuario point = (Usuario) obj;
		return (this.getIdUsuario() == point.getIdUsuario());

	}

	public String getImage() {
		//Este codigo es tomado de la pagina www.gravatar.com existe un soporte http://es.gravatar.com/support/
		String imagen = "http://www.gravatar.com/avatar/";
		try {
			String hashImage = this.hashImage();
			imagen += hashImage;
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		imagen += "?r=pg&d=mm";
		return imagen;
	}

	private String hashImage() throws NoSuchAlgorithmException {
		String password = this.getMail();
		String input = password.toLowerCase();
		String result = input;
		if (input != null) {
			MessageDigest md = MessageDigest.getInstance("MD5"); // or "SHA-1"
			md.update(input.getBytes());
			BigInteger hash = new BigInteger(1, md.digest());
			result = hash.toString(16);
			while (result.length() < 32) { // 40 for SHA-1
				result = "0" + result;
			}
		}
		return result;
	}

	public Usuario() {
		// TODO Auto-generated constructor stub
	}
	
 

	@Override
	public int hashCode() {
		int hash = 1;
		return hash * 31 + idUsuario.hashCode();
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return this.nombres + " , " + this.apellidos;
	}

}
